// Copyright 2024 Tvux
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package _006

// convert
// 模拟题
// 不需要关心解释中的空格，因为实际输出的是没有空格的
// 因为是Z字形输出，所以需要一个矩阵来存放一个个的字符，然后先向下放，到底了再向上放即可
// 比如：
// P     I    N
// A   L S  I G
// Y A   H R
// P     I
// 不考虑空格的话，就是这样
// matrix[0]: P I N
// matrix[1]: A L S I G
// matrix[2]: Y A H R
// matrix[3]: P I
// 核心就是控制放的方向，先向下，然后向上放
func convert(s string, numRows int) string {
	// 注意：这里只是初始化了有numRows个切片matrix[i]，但是每一个切片可以存放多少个元素并没有初始化
	matrix := make([][]byte, numRows)
	down, up := 0, numRows-2 // down从0开始放，放到numRows就停，up从numRows-1-1（即倒数第二行）开始放，放到0就停
	for i := 0; i != len(s); {
		// 遍历s中的元素
		if down != numRows {
			// 从上往下放
			matrix[down] = append(matrix[down], s[i])
			down++
			i++
		} else if up > 0 {
			// down == numRows了，说明该从下往上放了
			matrix[up] = append(matrix[up], s[i])
			up--
			i++
		} else {
			// up == 0 重置下一轮
			down, up = 0, numRows-2
		}
	}

	res := make([]byte, 0, len(s))
	for _, row := range matrix {
		res = append(res, row...)
	}
	return string(res)
}
